package student.aistar.day15.thread01;

public class Thread01 extends Thread{
    @Override
    public void run() {
        //让程序睡一会....
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //java.Thread.Thread提供的方法
        //static Thread currentThread(); //返回的是当前正在执行的线程的引用/对象
        //String getName(); //返回的是线程的名称

        //如果没有给线程设置名称, 那么系统会自动默认给线程分配一个名称
        //格式: Thread - 数字

        System.out.println(Thread.currentThread().getName());
    }

}
//启动JVM的时候, 后台有四个线程
//main线程, GC线程, t1线程, t2线程 - 并发执行 - 同时执行
class TestThread01{
    public static void main(String[] args) {
        //1. 创建两个线程

        //A. 当线程对象一旦被创建成功, 线程处于新建状态/瞬态 - new
        Thread t1 = new Thread01();
        Thread t2 = new Thread01();

        //设置线程的属性 - 设置线程的名称
        //设置线程的属性一定是在启动县城之前完成
        t1.setName("线程one");
        t2.setName("线程two");

        //结论: 并不是先启动哪个线程, 就一定会先去执行哪个线程 - 线程的执行是由cpu控制的 - 不是由人去控制的

        //2.启动线程 - 调用start方法
        //启动线程是调用run方法发还是调用start方法
        t1.start();//底层是让jvm去调度线程的, run方法是由jvm去执行的

        //B. 一旦调用了start方法, 表示线程已经处于就绪状态[并不是运行态]
        //只是说明此线程已经做好了准备. 随时等待cpu调度执行
        //并不是我们调用了start方法, 这个线程就一定会立即被调用


        //C.运行态 - 程序正常运行的过程

        //D. Dead[死亡状态] - 结束状态 - 线程执行结束了.
        t2.start();

        //main执行结束...

        //并发跑
        //main线程 - 跑
        //t1线程 - 跑
        //t2线程 - 跑
        System.out.println(Thread.currentThread().getName() + "执行结束...");
    }
}
